import UIKit

// 蛇身
class SnakeBody: NSObject {
    // 类型
    public enum _Type {
        case APPLE  // 果子
        case SNAKE  // 蛇
    }

    private var mColor: CGColor!        // 颜色
    private let mDrawer: CGContext      // 绘图者
    private var mNext: SnakeBody?       // 下一个蛇身
    private var mPosition: CGPoint      // 位置

    /**
     * 构造方法。
     * @param drawer    绘图者
     * @param point     位置
     * @param type      类型
     */
    public init(_ drawer: CGContext, point: CGPoint, type: _Type) {
        // 初始化成员
        mDrawer = drawer
        mPosition = point
        super.init()
        
        // 设置类型
        self.setType(type)
    
        // 画自身
        self.draw()
    }

    /**
     * 画自身。
     */
    public func draw() {
        self.erase()
        mDrawer.setFillColor(mColor)
        let rect = CGRect(x: mPosition.x * Const.GRID_SIZE, y: mPosition.y * Const.GRID_SIZE, width: Const.GRID_SIZE, height: Const.GRID_SIZE)
        mDrawer.fillEllipse(in: rect)
    }
    
    /**
     * 将蛇身从原来的位置中抹除。
     */
    public func erase() {
        mDrawer.setFillColor(Const.GAME_BOARD_COLOR)
        let rect = CGRect(x: mPosition.x * Const.GRID_SIZE, y: mPosition.y * Const.GRID_SIZE, width: Const.GRID_SIZE, height: Const.GRID_SIZE)
        mDrawer.fill(rect)
    }

    /**
     * 获取/设置下一个蛇身。
     */
    public var next: SnakeBody? {
        get {
            return mNext
        }
        set {
            mNext = newValue
        }
    }
    /**
     * 获取/设置位置。
     */
    public var position: CGPoint {
        get {
            return mPosition
        }
        set {
            mPosition.x = newValue.x
            mPosition.y = newValue.y
        }
    }
    
    /**
     * 获取类型。
     * @param type  类型
     */
    public func setType(_ type: _Type) {
        if type == .SNAKE {
            mColor = Const.SNAKE_COLOR
        } else {
            mColor = Const.APPLE_COLOR
        }
    }
}
